進入Sort囉~~~
用Javascript征服演算法 (3-select sort & 實作)
轉眼間就來到鐵人賽第五天了!! 排列組合的問題也該告一段落
接下來開始介紹演算法(or資結)中蠻常見的Sort的問題,但在介紹之前,我想先對幾個簡單的Sort作為進入點
大致上在解Sort problem當中,最基本的就是Select Sort、Insert Sort 跟 Bubble Sort
今天就先來介紹簡單的Select Sort,以及他的javascript實作(相對前幾天來說更為簡單)
Select Sort
Select Sort的做法呢,首先他會將需要排序的目標,分成兩堆,一堆為已排序,另外一堆為未排序
分完兩堆後,會將未排序中最大or最小值(看是要由小排到大,還是由大排到小)加入已排序的資料的最後面
以上就是Select Sort的運作方式(什麼結束了? 當然~因為它是簡單排序法阿XD)
接下來就是Javascript的實作囉
一樣,先來分析我們需要哪幾個步驟來完成程式
ps. 在實作時,會直接將已排序的資料設定在最左側
OK 以上四步驟後,就可以開始寫Code了
首先是 1. 一個定義好的list
var list = [10, 9, 1, 2, 5, 3, 8, 7];
再來是 2. 搜尋陣列
for(var i = 0; i < list.length; i++) {
}
搜尋未排序陣列
for(var i = from + 1; i < to; i++) {
}
找出最大or最小值,加到已排序資料
function ascending(a, b) {return a - b;}
5.當在比較過程,搜尋到最大or最小值時,可能需要作swap來將此值移到已排序的資料中
function swap(list, i, j) {
var tmp = list[i];
list[i] = list[j];
list[j] = tmp;
}
以上程式碼完整呈現如下
function swap(list, i, j) {
var tmp = list[i];
list[i] = list[j];
list[j] = tmp;
}
function ascending(a, b) {return a - b;}
function selectedIdx(list, from, to, compare) {
var selected = from;
for(var i = from + 1; i < to; i++) {
if(compare(list[i], list[selected]) < 0) {
selected = i;
}
}
return selected;
}
function selectionSort(list, compare) {
for(var i = 0; i < list.length; i++) {
var selected = selectedIdx(list, i, list.length, compare);
if(selected !== i) { swap(list, i, selected); }
}
}
var list = [10, 9, 1, 2, 5, 3, 8, 7];
selectionSort(list, ascending);
console.log(list);
今天的Select Sort探討就到這邊,明天會介紹Inselect Sort囉!!!
想直接運行程式可以到以下連結當中
[
http://jsfiddle.net/stanney/TrW6P/](<br />
http://jsfiddle.net/stanney/TrW6P/)